package com.lin.forum.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.DigestUtils;

import java.io.UnsupportedEncodingException;
import java.util.UUID;

@Slf4j
public class SecurityUtils {
    /**
     * 密码加密方法 - 使用盐值+MD5进行加密
     *
     * @param password 原始密码
     * @return 加密后的完整字符串（盐值+加密结果）
     * @throws UnsupportedEncodingException 如果不支持UTF-8编码
     *
     * 加密逻辑：
     * 1. 生成一个随机盐值（32位UUID）
     * 2. 将盐值与原始密码拼接
     * 3. 对拼接后的字符串进行MD5哈希
     * 4. 将盐值和哈希结果组合为最终密文
     */
    public static String encrypt(String password){
        // 生成随机盐值（移除UUID中的分隔符）
        String salt = UUID.randomUUID().toString().replace("-", "");
        String secretString=null;
        try {
            // 将盐值附加到密码前，然后进行MD5哈希
            secretString = DigestUtils.md5DigestAsHex((salt + password).getBytes("UTF-8"));
        }catch (UnsupportedEncodingException e){
            log.error("在SecurityUtils，encrypt方法中使用try-catch报错");
            throw new RuntimeException(e);
        }
        // 返回格式：盐值(32位) + 加密结果(32位)
        return salt + secretString;
    }

    /**
     * 密码验证方法 - 验证输入密码是否与加密密码匹配
     *
     * @param password       用户输入的原始密码
     * @param finalPassword  存储的完整加密字符串
     * @return 如果匹配返回true，否则返回false
     * @throws UnsupportedEncodingException 如果不支持UTF-8编码
     *
     * 验证逻辑：
     * 1. 从完整加密字符串中提取盐值
     * 2. 使用相同盐值对输入密码进行加密
     * 3. 比较新生成的加密结果与存储的加密结果
     */
    public static Boolean verify(String password, String finalPassword) {
        if(finalPassword==null&&finalPassword.length()!=64) {
            log.error("在SecurityUtils，verify方法中，密码长度不足 password= "+password);
            return false;
        }
        // 从完整密文中提取前32位作为盐值
        String salt = finalPassword.substring(0, 32);
        String secretString=null;
        try {
            // 使用提取的盐值对用户输入的密码进行相同加密操作
            secretString = DigestUtils.md5DigestAsHex((salt + password).getBytes("UTF-8"));
        }catch (UnsupportedEncodingException e){
            log.error("在SecurityUtils，verify方法中使用try-catch报错");
            throw new RuntimeException(e);
        }
        // 比较生成的密文与存储的密文是否一致
        return (salt + secretString).equals(finalPassword);
    }
}